import Axios from 'axios'
//请求失败 接口重试
import axiosRetry from 'axios-retry'
//支持jsonp
import jsonpAdapter from 'axios-jsonp'
//序列化
import qs from "qs";
import {ElMessage} from 'element-plus'

//重复请求
const pendingMap = new Map();

/**
 * 生成每个请求唯一的键
 * @param {*} config
 * @returns string
 */
function getPendingKey(config) {
    let {url, method, params, data} = config;
    if (typeof data === 'string') data = JSON.parse(data); // response里面返回的config.data是个字符串对象
    return [url, method, JSON.stringify(params), JSON.stringify(data)].join('&');
}

/**
 * 储存每个请求唯一值, 也就是cancel()方法, 用于取消请求
 * @param {*} config
 */
function addPending(config) {
    const pendingKey = getPendingKey(config);
    config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
        if (!pendingMap.has(pendingKey)) {
            pendingMap.set(pendingKey, cancel);
        }
    });
}

/**
 * 删除重复的请求
 * @param {*} config
 */
function removePending(config) {
    const pendingKey = getPendingKey(config);
    if (pendingMap.has(pendingKey)) {
        const cancelToken = pendingMap.get(pendingKey);
        cancelToken(pendingKey);
        pendingMap.delete(pendingKey);
    }
}


const service = Axios.create({
    // baseURL: '/api', //
    baseURL: '/api', //
    // withCredentials: true, // 表示跨域请求时是否需要使用凭证
    timeout: 10000 // 设置接口超时时间10s
})

// 安装 retry 插件
// 当请求失败后，自动重新请求，只有3次失败后才真正失败
axiosRetry(service, {retries: 3})

// export async function request(url, config) {
//     const response = await client.request({url, ...config})
//     const result = response.data
//     // 你的业务判断逻辑
//     return result
// }
//
// export function jsonp(url, config) {
//     return request(url, { ...config, adapter: jsonpAdapter })
// }

// let service = Axios;
//
service.interceptors.request.use(
    config => {
        console.log(config,'ceshi')
        // const Authorization = localStorage.getItem('Authorization') || ''
        // if (Authorization) {
        //     // 让每个请求携带token
        //     config.headers['Authorization'] = Authorization
        // }
        if (
            config.method === "post" ||
            config.method === "put" ||
            config.method === "delete"
        ) {
            // qs序列化
            config.data = qs.parse(config.data);
        }
        //取消重复请求
        // removePending(config);
        // addPending(config);

        return config
    },
    error => {
        console.log('请求错误', error) // for debug
        return Promise.reject(error)
    }
)
//response 拦截
service.interceptors.response.use(response => {
    console.log(response, '请求成功')
    const res = response.data
    // removePending(response.config);
    if (response.status === 200) {
        if (res.success) {
            return res.data
        }
    } else {
        ElMessage.error(res.error.message || 'Error')
        return Promise.reject(new Error(res.message || 'Error'))
    }
}, error => {
    console.log(error, '请求失败')
    // error.config && removePending(error.config);
    ElMessage({
        ElMessage: error.ElMessage,
        type: 'error',
        duration: 3 * 1000
    })
    return Promise.reject(error)
})

export default service
